package com.xiaoge;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletRegistration;

public class MyWebApplicationInitializer implements WebApplicationInitializer {

	/**
	 * todo 这是用java方式, 替换了xml的方式 **(这也是为什么springboot内部Tomcat只需要给它DispatcherServlet
	 * 		就可以把项目跑起来的原因, 实现的0配置, 不需要web.xml的原因)**
	 *
	 * todo Tomcat调用SpringServletContainerInitializer下的onStartup方法, 因为它实现了servlet3.0规范ServletContainerInitializer
	 * 	 	而因为SpringServletContainerInitializer类上加了@HandlesTypes(WebApplicationInitializer.class), 它获取找所有该类型的class
	 * 	  	传入给webAppInitializerClasses, 其中就有我们自己写的MyWebApplicationInitializer, 然后掉它自己的onStartup方法
	 *
	 * todo 注意:classpath:META-INF/services下必须要有一个javax.servlet.ServletContainerInitializer文件名, 内容是它的实现类, 调用这个方法的前提是你要告诉tomcat这是个web项目
	 *
	 * @param servletContext the {@code ServletContext} to initialize
	 */
	@Override
	public void onStartup(ServletContext servletContext) {

		// Load Spring web application configuration
		AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
		context.register(AppConfig.class);

		// Create and register the DispatcherServlet
		DispatcherServlet servlet = new DispatcherServlet(context);
		/**
		 * 相当一传统对的web.xml当中的
		 * <servlet>
		 *     <servlet-class>xxxx</servlet-class>
	 	 * <servlet/>
		 *
		 * 也相当于servlet3.0提供的@WebServlet
		 */
		ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
		registration.setLoadOnStartup(1);
		registration.addMapping("/app/*");
	}
}